/**
 * 装饰模式
 */
//  主要作用就是：

//  增强一个类原有的功能
//  为一个类添加新的功能
// 装饰模式也不会改变原有的类

// 新建颜值接口
interface IBeauty {
    getBeautyValue(): number;
}

class Me implements IBeauty {
    getBeautyValue() {
        return 100;
    }
}
// 戒指装饰类
class RingDecorator implements IBeauty {
    private readonly me: IBeauty;
    constructor(me: IBeauty) {
        this.me = me;
    }
    getBeautyValue() {
        return this.me.getBeautyValue() + 20;
    }
}

// 耳环装饰类：
class EarringDecorator implements IBeauty {
    private readonly me: IBeauty;
    constructor(me: IBeauty) {
        this.me = me;
    }
    getBeautyValue() {
        return me.getBeautyValue() + 50;
    }
}
const me: IBeauty = new Me();
console.log('我原本的颜值：' + me.getBeautyValue());
const meWithRing: IBeauty = new RingDecorator(me);
console.log('戴上了戒指后，我的颜值：' + meWithRing.getBeautyValue());
// 多次装饰
const meWithManyDecorators: IBeauty = new RingDecorator(new EarringDecorator(me));
console.log('戴上耳环、戒指后，我的颜值：' + meWithManyDecorators.getBeautyValue());

// ---添加新功能
// 新建房屋接口
interface IHouse {
    live(): void;
}
// 房屋类
class House implements IHouse {
    live() {
        console.log('房屋原有的功能：居住功能');
    }
}
// 新建粘钩装饰器接口，继承自房屋接口
interface IStickyHookHouse extends IHouse {
    hangThings(): void;
}
// 粘钩装饰类：
class StickyHookDecorator implements IStickyHookHouse {
    private readonly house: IHouse;
    constructor(house: IHouse) {
        this.house = house;
    }
    live() {
        this.house.live();
    }
    hangThings() {
        console.log('有了粘钩后，新增了挂东西功能');
    }
}

const house: IHouse = new House();
house.live();
// 半透明装饰模式中，我们无法多次装饰。
const stickyHookHouse: IStickyHookHouse = new StickyHookDecorator(house);
stickyHookHouse.live();
stickyHookHouse.hangThings();
